package pe.com.clinicaesb.conexion;

import net.rim.device.api.servicebook.ServiceRecord;


public class URLFactory {
    private String url="";  
    private String protocol="";
    private String host="";
    private String port="";
    private String absPath="";
    private boolean isSecured=false;
    
    private int portBeginsAt=-1;
    private int absolutePathBeginsAt=-1;
    private int httpParamIndex=-1;
    
    
    public URLFactory(String url){      
        this.url = url.trim();
        
        if(this.url.indexOf("://")!=-1){
            protocol = this.url.substring(0, this.url.indexOf("://")+3);
            this.url = this.url.substring(this.url.indexOf("://")+3, this.url.length());
        } else{
            protocol = "http://";
        }
        protocol = protocol.toLowerCase();
        
        if(protocol.indexOf("https")!=-1 || protocol.indexOf("ssl")!=-1 || protocol.indexOf("tls")!=-1 ){
            isSecured = true;
        }
        
        httpParamIndex = this.url.indexOf('?');     
        
        if(httpParamIndex!=-1 && this.url.indexOf(':')!=-1 && this.url.indexOf(':')<httpParamIndex){
            portBeginsAt = this.url.indexOf(':');
        } else if(httpParamIndex==-1 && this.url.indexOf(':')!=-1){
            portBeginsAt = this.url.indexOf(':');
        }
        
        if(httpParamIndex!=-1 && this.url.indexOf('/')!=-1 && this.url.indexOf('/')<httpParamIndex){
            absolutePathBeginsAt = this.url.indexOf('/');
        } else if(httpParamIndex==-1 && this.url.indexOf('/')!=-1){
            absolutePathBeginsAt = this.url.indexOf('/');
        } 
        
        if(portBeginsAt!=-1)
            host = this.url.substring(0, portBeginsAt);
        else if(absolutePathBeginsAt!=-1)
            host = this.url.substring(0, absolutePathBeginsAt);
        else 
            host = this.url.substring(0, this.url.length());
        
        if(portBeginsAt!=-1){
            if(absolutePathBeginsAt!=-1){
                port = this.url.substring(portBeginsAt+1, absolutePathBeginsAt);
            } else{
                port = this.url.substring(portBeginsAt+1, this.url.length());
            }
        } else{
            if(isSecured)
                port = "443";
            else
                port = "80";
        }
        
        if(absolutePathBeginsAt!=-1){
            absPath = this.url.substring(absolutePathBeginsAt, this.url.length());
        } else{
            absPath = "/";
        }
        
        
    }
    
    
    
    public String getUrl() {
        return url;
    }



    public void setUrl(String url) {
        this.url = url;
    }



    public String getProtocol() {
        return protocol;
    }



    public void setProtocol(String protocol) {
        this.protocol = protocol;
    }



    public String getHost() {
        return host;
    }



    public void setHost(String host) {
        this.host = host;
    }



    public String getPort() {
        return port;
    }



    public void setPort(String port) {
        this.port = port;
    }



    public String getAbsolutePath() {
        return absPath;
    }



    public void setAbsPath(String absPath) {
        this.absPath = absPath;
    }



    public boolean isSecured() {
        return isSecured;
    }



    public void setSecured(boolean isSecured) {
        this.isSecured = isSecured;
    }


    public String getHttpDefaultUrl(){
        if(isSecured()){
            return "https://" + host + ":" + port + absPath;            
        } else{
            return "http://" + host + ":" + port + absPath;
        }
    }
    
    public String getHttpTcpCellularUrl(String apn, String apnUser, String apnPassword){
        if(apn!=null && apn.length()>0)
            apn = ";apn="+apn;      
        else
            apn = "";
        
        if(apnUser!=null && apnUser.length()>0)
            apnUser = ";TunnelAuthUsername="+apnUser;
        else
            apnUser = "";
        
        if(apnPassword!=null && apnPassword.length()>0)
            apnPassword = ";TunnelAuthPassword="+apnPassword;
        else
            apnPassword = "";
        
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";deviceside=true" + apn+apnUser+apnPassword;         
        } else{
            return "http://" + host + ":" + port + absPath + ";deviceside=true" + apn+apnUser+apnPassword;
        }
    }
    
    public String getHttpMdsUrl(boolean e2eRequired){
        String e2e="";
        if(e2eRequired)
            e2e = ";EndToEndRequired";
        
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";deviceside=false" + e2e;            
        } else{
            return "http://" + host + ":" + port + absPath + ";deviceside=false";
        }
    }
    
    public String getHttpBisUrl(){
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";deviceside=false;ConnectionType=mds-public";            
        } else{
            return "http://" + host + ":" + port + absPath + ";deviceside=false;ConnectionType=mds-public";
        }
    }
    
    public String getHttpWap2Url(ServiceRecord wap2ServiceRecord){
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";deviceside=true" + ";ConnectionUID=" + wap2ServiceRecord.getUid();          
        } else{
            return "http://" + host + ":" + port + absPath + ";deviceside=true" + ";ConnectionUID=" + wap2ServiceRecord.getUid();
        }
    }
    
    public String getHttpDefaultTcpCellularUrl(ServiceRecord tcpServiceRecord) {
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";deviceside=true" + ";ConnectionUID=" + tcpServiceRecord.getUid();           
        } else{
            return "http://" + host + ":" + port + absPath + ";deviceside=true" + ";ConnectionUID=" + tcpServiceRecord.getUid();
        }
    }
    
    public String getHttpTcpWiFiUrl(){
        if(isSecured()){
            return "https://" + host + ":" + port + absPath + ";interface=wifi";            
        } else{
            return "http://" + host + ":" + port + absPath + ";interface=wifi";
        }
    }
    
    public String getHttpWap1Url(String gatewayAPN, String gatewayIP, String gatewayPort, String sourceIP, 
            String sourcePort, String username, String password, boolean enableWTLS){       
        boolean paramsValid = true;     
        String result;
        
        if(isSecured()){
            result = "https://" + host + ":" + port + absPath + ";deviceside=true";         
        } else{
            result = "http://" + host + ":" + port + absPath + ";deviceside=true";          
        }
        
        if(gatewayAPN!=null && gatewayAPN.length()>0){
            result = result+";WapGatewayAPN="+gatewayAPN;           
        } else{
            paramsValid = false;
        }
        if(gatewayIP!=null && gatewayIP.length()>0){
            result = result+";WapGatewayIP="+gatewayIP;         
        } else{
            paramsValid = false;
        }
        if(gatewayPort!=null && gatewayPort.length()>0){
            result = result+";WapGatewayPort="+gatewayPort;         
        }
        if(sourceIP!=null && sourceIP.length()>0){
            result = result+";WapSourceIP="+sourceIP;
        }
        if(sourcePort!=null && sourcePort.length()>0){
            result = result+";WapSourcePort="+sourcePort;
        }
        if(username!=null && username.length()>0){
            result = result+";TunnelAuthUsername="+username;
        }
        if(password!=null && password.length()>0){
            result = result+";TunnelAuthPassword="+password;
        }
        if(enableWTLS){
            result = result+";WapEnableWTLS=true";;
        }
        
        if(paramsValid)
            return result;
        else
            return null;
    }
    
    
    public String getSocketDefaultUrl(){
        if(isSecured()){
            return "ssl://" + host + ":" + port;            
        } else{
            return "socket://" + host + ":" + port;
        }
    }
    
    public String getSocketTcpCellularUrl(String apn, String apnUser, String apnPassword){
        if(apn!=null && apn.length()>0)
            apn = ";apn="+apn;      
        else
            apn = "";
        
        if(apnUser!=null && apnUser.length()>0)
            apnUser = ";TunnelAuthUsername="+apnUser;
        else
            apnUser = "";
        
        if(apnPassword!=null && apnPassword.length()>0)
            apnPassword = ";TunnelAuthPassword="+apnPassword;
        else
            apnPassword = "";
        
        if(isSecured()){
            return "ssl://" + host + ":" + port + ";deviceside=true" + apn+apnUser+apnPassword;         
        } else{
            return "socket://" + host + ":" + port + ";deviceside=true" + apn+apnUser+apnPassword;
        }
    }
    
    public String getSocketMdsUrl(boolean e2eRequired){
        String e2e="";
        if(e2eRequired)
            e2e = ";EndToEndRequired";
        
        if(isSecured()){
            return "ssl://" + host + ":" + port + ";deviceside=false" + e2e;            
        } else{
            return "socket://" + host + ":" + port + ";deviceside=false";
        }
    }
    
    public String getSocketBisUrl(){
        if(isSecured()){
            return "ssl://" + host + ":" + port + ";deviceside=false;ConnectionType=mds-public";            
        } else{
            return "socket://" + host + ":" + port + ";deviceside=false;ConnectionType=mds-public";
        }
    }
    
    public String getSocketDefaultTcpCellularUrl(ServiceRecord tcpServiceRecord) {
        if(isSecured()){
            return "ssl://" + host + ":" + port + ";deviceside=true" + ";ConnectionUID=" + tcpServiceRecord.getUid();           
        } else{
            return "socket://" + host + ":" + port + ";deviceside=true" + ";ConnectionUID=" + tcpServiceRecord.getUid();
        }
    }
    
    public String getSocketWap2Url(ServiceRecord wap2ServiceRecord){
        if(wap2ServiceRecord==null)
            return null;
        
        if(isSecured()){
            return "ssl://" + host + ":" + port + ";deviceside=true" + ";ConnectionUID=" + wap2ServiceRecord.getUid();          
        } else{
            return "socket://" + host + ":" + port + ";deviceside=true" + ";ConnectionUID=" + wap2ServiceRecord.getUid();
        }
    }
    
    public String getSocketTcpWiFiUrl(){
        if(isSecured()){ 
            return "ssl://" + host + ":" + port + ";interface=wifi";            
        } else{
            return "socket://" + host + ":" + port + ";interface=wifi";
        }
    }
    
    public String getSocketWap1Url(String gatewayAPN, String gatewayIP, String gatewayPort, String sourceIP, 
            String sourcePort, String username, String password, boolean enableWTLS){       
        boolean paramsValid = true;     
        String result;
        
        if(isSecured()){
            result = "ssl://" + host + ":" + port + ";deviceside=true";         
        } else{
            result = "socket://" + host + ":" + port + ";deviceside=true";          
        }
        
        if(gatewayAPN!=null && gatewayAPN.length()>0){
            result = result+";WapGatewayAPN="+gatewayAPN;           
        } else{
            paramsValid = false;
        }
        if(gatewayIP!=null && gatewayIP.length()>0){
            result = result+";WapGatewayIP="+gatewayIP;         
        } else{
            paramsValid = false;
        }
        if(gatewayPort!=null && gatewayPort.length()>0){
            result = result+";WapGatewayPort="+gatewayPort;         
        }
        if(sourceIP!=null && sourceIP.length()>0){
            result = result+";WapSourceIP="+sourceIP;
        }
        if(sourcePort!=null && sourcePort.length()>0){
            result = result+";WapSourcePort="+sourcePort;
        }
        if(username!=null && username.length()>0){
            result = result+";TunnelAuthUsername="+username;
        }
        if(password!=null && password.length()>0){
            result = result+";TunnelAuthPassword="+password;
        }
        if(enableWTLS){
            result = result+";WapEnableWTLS=true";;
        }
        
        if(paramsValid)
            return result;
        else
            return null;
    }
}